package cn.leedsoft.luma.test.design_pattern;

/**
 * 建造者模式
 * Created by leeds on 2017/6/14.
 * 1、构建复杂产品。
 * 2、存在多个组装材料（依赖），可以内置默认值，也可设置必须提供
 * 3、存在一个组装算法（比如顺序等等）
 * 4、链式编程
 */
public class Builder {
    public static void main(String[] args) {
        TomatoEgg tomatoEgg = new ConcreteBuilder1().setEgg()
                .setOil().setSalt()
                .setSugar().setTomato()
                .build();
        System.out.println(tomatoEgg);
    }
}

//复杂产品：西红柿炒鸡蛋
class TomatoEgg {
    @Override
    public String toString() {
        return "一份西红柿炒鸡蛋";
    }
}

interface Builder1 {
    //组装材料：鸡蛋egg，西红柿tomato，油oil，盐salt，糖sugar
    Builder1 setEgg();//所有方法，返回Builder，从而支持链式编程。
    Builder1 setTomato();
    Builder1 setOil();
    Builder1 setSalt();
    Builder1 setSugar();
    //组装算法（有顺序等等）
    TomatoEgg build();
}

class ConcreteBuilder1 implements Builder1 {

    @Override
    public Builder1 setEgg() {
        System.out.println("获得鸡蛋");
        return this;
    }

    @Override
    public Builder1 setTomato() {
        System.out.println("获得西红柿");
        return this;
    }

    @Override
    public Builder1 setOil() {
        System.out.println("获得油");
        return this;
    }

    @Override
    public Builder1 setSalt() {
        System.out.println("获得盐");
        return this;
    }

    @Override
    public Builder1 setSugar() {
        System.out.println("获得糖");
        return this;
    }

    @Override
    public TomatoEgg build() {
        System.out.println("按步骤，炒鸡蛋。如果此时材料不足，抛异常哦。");
        return new TomatoEgg();
    }
}






